home *** CD-ROM | disk | FTP | other *** search
- (***************************************************************************
-
- $RCSfile: Fonts.mod $
- Description: Port of the Project Oberon Fonts module
-
- Created by: J. Gutknecht
- Ported by: fjc (Frank Copeland)
- $Revision: 1.12 $
- $Author: fjc $
- $Date: 1995/01/26 00:48:34 $
-
- Copyright © 1990-1993, ETH Zuerich
- Copyright © 1994, Frank Copeland.
- This file is part of the Oberon-A Library.
- See Oberon-A.doc for conditions of use and distribution.
-
- ***************************************************************************)
-
- <* STANDARD- *> <* MAIN- *>
-
- MODULE Fonts;
-
- IMPORT
- SYS := SYSTEM, Kernel, gfx := Graphics, df := DiskFont,
- str := Strings, str2 := Strings2;
-
- TYPE
-
- Name * = ARRAY 32 OF CHAR;
-
- Font * = POINTER TO FontDesc;
- FontDesc * = RECORD
- name * : Name;
- height * : INTEGER;
- textAttr * : gfx.TextAttrPtr;
- textFont * : gfx.TextFontPtr;
- next : Font;
- END; (* FontDesc *)
-
- VAR
-
- Default *, First : Font;
- nofFonts : INTEGER;
-
- (*------------------------------------*)
- PROCEDURE This * (name : ARRAY OF CHAR) : Font;
- (*
- * Opens the font described by name and returns a descriptor for it.
- * name is required to be in the common Amiga notation for fonts, namely:
- *
- * <font name>/<font size>
- *
- * For example: "topaz/8" refers to the size 8 version of the topaz font.
- *)
-
- VAR
- F : Font; fontName : Name; len, pos : LONGINT; size, i : INTEGER;
- ch : CHAR; textAttr : gfx.TextAttrPtr; textFont : gfx.TextFontPtr;
-
- <*$CopyArrays-*>
- BEGIN (* This *)
- F := First; WHILE (F # NIL) & (name # F.name) DO F := F.next END;
- IF F = NIL THEN
- COPY (name, fontName);
- pos := str2.FindChar ("/", fontName, 0);
- IF pos >= 0 THEN
- len := str.Length (fontName);
- IF len > (pos + 1) THEN
- i := SHORT (pos) + 1; size := 0; ch := fontName [i];
- WHILE (i < len) & (ch >= "0") & (ch <= "9") DO
- size := (size * 10) + (ORD (ch) - ORD ("0"));
- INC (i); ch := fontName [i]
- END; (* WHILE *)
- IF i = len THEN
- fontName [pos] := 0X; str.Append (".font", fontName);
- NEW (textAttr);
- SYS.NEW (textAttr.name, str.Length (fontName) + 1);
- COPY (fontName, textAttr.name^);
- textAttr.ySize := size;
- textAttr.style := gfx.normal;
- textAttr.flags := {gfx.diskFont};
- textFont := df.OpenDiskFont (textAttr^);
- IF textFont # NIL THEN
- NEW (F);
- COPY (name, F.name); F.height := size;
- F.textAttr := textAttr; F.textFont := textFont;
- F.next := First; First := F
- ELSE
- SYS.DISPOSE (textAttr.name); SYS.DISPOSE (textAttr);
- F := Default
- END; (* ELSE *)
- ELSE
- F := Default
- END; (* ELSE *)
- ELSE
- F := Default
- END; (* ELSE *)
- ELSE
- F := Default
- END; (* ELSE *)
- END; (* IF *)
- RETURN F
- END This;
-
- (*------------------------------------*)
- PROCEDURE* Cleanup (VAR rc : LONGINT);
-
- VAR F : Font;
-
- BEGIN (* Cleanup *)
- F := First;
- WHILE F # Default DO
- IF F.textFont # NIL THEN gfx.CloseFont (F.textFont) END;
- F := F.next
- END;
- END Cleanup;
-
- (*------------------------------------*)
- PROCEDURE GetDefault ();
-
- VAR defFont : gfx.TextFontPtr; ta : gfx.TextAttrPtr;
-
- BEGIN (* GetDefault *)
- defFont := gfx.base.defaultFont;
- NEW (ta);
- ta.name := defFont.message.node.name; ta.ySize := defFont.ySize;
- ta.style := defFont.style; ta.flags := defFont.flags;
- NEW (Default);
- COPY (defFont.message.node.name^, Default.name);
- Default.height := defFont.ySize; Default.textAttr := ta;
- Default.textFont := defFont; Default.next := NIL;
- END GetDefault;
-
- BEGIN (* Fonts *)
- ASSERT (df.base # NIL, 100);
- GetDefault (); First := Default; nofFonts := 1;
- Kernel.SetCleanup (Cleanup)
- END Fonts.
-